iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
自我挑戰組

leetcode解題學習java系列 第 4

30天LeetCode挑戰紀錄-DAY4. Majority Element I/II

  • 分享至 

  • xImage
  •  

題目

https://ithelp.ithome.com.tw/upload/images/20250918/20178158RBV6N55yAp.png
題目說他會給我們一個陣列,然後我們要找到出現次數最多的元素,並且回傳給他,而且他說這個要找的元素出現次數一定會大於全部元素數量的1/2

想法

我一開始想說那我先遍歷整個陣列然後統計每個數字各自出現的數量再判斷,後來我突然想到一個很簡單的方法,因為題目說「我們要找的這個元素數量一定會大於全部元素的一半」,所以我想說只要我打這個陣列由小到大排好,然後最中間的那個元素一定是我們要找的數。

所以我想用Array.sort來排序陣列,然後再取中間的元素就可以很簡單的找到了。

程式碼

class Solution {
    public int majorityElement(int[] nums) {
       Arrays.sort(nums);  //由小到大排序
       return nums[nums.length/2];
    }
}

執行成功畫面
https://ithelp.ithome.com.tw/upload/images/20250918/201781587XiBQBoGwT.png

然後這個題目還有Majority Element II,所以想一起試試看

題目

https://ithelp.ithome.com.tw/upload/images/20250918/20178158OSeBd1vmz0.png
題目跟剛剛那題很像,只是他要把所有出現次數超過所有元素1/3的都找出來然後回傳。

想法

因為他要把所有出現次數超過n/3的元素都找出來,所以我想說只好跟我本來的想法一樣排序好之後統計了。
我想說先把他們從小到大排好,然後設一個變數來計出現的次數,如果次數大於陣列長度的1/3就把這個元素放入我們的result,然後都跑完之後把result回傳。

程式碼

class Solution {
    public List<Integer> majorityElement(int[] nums) {
        Arrays.sort(nums);  //排序
        List<Integer> result = new ArrayList<>();
        int n = nums.length;
        int count = 1;

        for (int i = 1; i <= n; i++) {
            if (i < n && nums[i] == nums[i - 1]){ 
                count++;
            }
            else {
                if (count > n / 3){
                    result.add(nums[i - 1]);
                }
                count = 1;  //重置計數器
            }
        }
        return result;
    }
}

執行成功畫面
https://ithelp.ithome.com.tw/upload/images/20250918/20178158Ye0vSjX7nY.png


上一篇
30天LeetCode挑戰紀錄-DAY3. Best Time To Buy And Sell Stock
下一篇
30天LeetCode挑戰紀錄-DAY5. Product of Array Except Self
系列文
leetcode解題學習java16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言